में समयपूर्व डिलोक मुझे एक समस्या है जो एक एआरसी आधारित ऐप में एक उपयोग में आने वाली वस्तु का समयपूर्व रिलीज प्रतीत होता है। मैं एक FTP सर्वर पर एक फ़ोल्डर बनाने की कोशिश कर रहा हूँ। कोड के प्रासंगिक भाग नीचे हैं; मैं पहले समस्या का वर्णन करूंगा। कोड के साथएआरसी आधारित ऐप
समस्या यह है कि
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
विधि में डिबग आउटपुट कभी नहीं कहा जाता है, है।
इसके बजाय, मुझे बस _EXC_BAD_ACCESS_ त्रुटि मिलती है। डिबगिंग जबकि मैं दो बातें पता चला:
त्रुटि केवल प्रकट होता है, तो कोड (createDir विधि) की निम्न पंक्ति निष्पादित होने
[ftpStream open];
अगर उस संदेश नहीं भेजा है , शेष कोड वास्तव में समझ में नहीं आता है - लेकिन यह या तो क्रैश नहीं होता है ...
मैंने ट्रैक किया NSZombieEnabled साथ EXC_BAD_ACCESS नीचे: ज़ोंबी वस्तुओं सक्षम होने पर, GDB निम्नलिखित डिबगर जानकारी का उत्पादन:
*** -[FTPUploads respondsToSelector:]: message sent to deallocated instance 0x9166590
में भेजा पता 0x9166590 मेरी FTPUploads का पता आपत्ति है। ऐसा लगता है कि संदेश को संभालने से पहले स्ट्रीम प्रतिनिधि प्रतिनिधि को हटा दिया जाता है।
सिस्टम इन-यूज ऑब्जेक्ट को क्यों रोकता है? मैं इसे समय से पहले हटाए जाने से कैसे रोक सकता हूं?
कोड:
FTPUploads.h अंश:
#import <Foundation/Foundation.h>
enum UploadMode {
UploadModeCreateDir,
UploadModeUploadeData
};
@class UploadDatasetVC;
@interface FTPUploads : NSObject<NSStreamDelegate> {
@private
NSString *uploadDir;
NSString *ftpUser;
NSString *ftpPass;
NSString *datasetDir;
NSArray *files;
/* FTP Upload fields */
NSInputStream *fileStream;
NSOutputStream *ftpStream;
// some more fields...
enum UploadMode uploadMode;
UploadDatasetVC *callback;
}
- (id) initWithTimeseriesID: (int) aTimeseriesID
fromDatasetDir: (NSString *) aDir
withFiles: (NSArray *) filesArg
andCallbackObject: (UploadDatasetVC *) aCallback;
- (void) createDir;
@end
FTPUploads.m अंश
#import "FTPUploads.h"
#import "UploadDatasetVC"
@implementation FTPUploads
- (id) initWithTimeseriesID: (int) aTimeseriesID
fromDatasetDir: (NSString *) aDir
withFiles: (NSArray *) filesArg
andCallbackObject: (UploadDatasetVC *) aCallback {
self = [super init];
if (self) {
uploadDir = [NSString stringWithFormat: @"ftp://aServer.org/%i/", aTimeseriesID];
ftpUser = @"aUser";
ftpPass = @"aPass";
datasetDir = aDir;
files = filesArg;
bufferOffset = 0;
bufferLimit = 0;
index = 0;
callback = aCallback;
}
return self;
}
- (void) createDir {
uploadMode = UploadModeCreateDir;
NSURL *destinationDirURL = [NSURL URLWithString: uploadDir];
CFWriteStreamRef writeStreamRef = CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) destinationDirURL);
assert(writeStreamRef != NULL);
ftpStream = (__bridge_transfer NSOutputStream *) writeStreamRef;
[ftpStream setProperty: ftpUser forKey: (id)kCFStreamPropertyFTPUserName];
[ftpStream setProperty: ftpPass forKey: (id)kCFStreamPropertyFTPPassword];
ftpStream.delegate = self;
[ftpStream scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode];
// open stream
[ftpStream open];
CFRelease(writeStreamRef);
}
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"aStream has an event: %i", eventCode);
switch (eventCode) {
// all cases handled properly
default:
// no event
NSLog(@"default mode; no event");
break;
}
}
संपादित: उस वर्ग UploadDatasetVC में प्रयोग किया जाता है जोड़ा सृजन कोड:
FTPUploads *uploads = [[FTPUploads alloc] initWithTimeseriesID: timeseries_id
fromDatasetDir: datasetDir
withFiles: files
andCallbackObject: self];
[uploads createDir];
ऑब्जेक्ट्स आम तौर पर अपने प्रतिनिधियों को बनाए रखने (या चाप के मामले में, मजबूत संदर्भ बनाए रखने) नहीं रखते हैं। मुझे लगता है कि समस्या उस कोड के साथ होगी जो आपके FtpUploads ऑब्जेक्ट बनाता है और इसके बाद यह क्या करता है –
मैं उस कोड को प्रश्न के दूसरे स्निपेट में जोड़ रहा हूं। पहले जवाब पर भी मेरी टिप्पणी देखें। –
इसके साथ क्या होता है? यदि अपलोड केवल एक स्थानीय चर है, जब यह दायरे से बाहर हो जाता है तो एआरसी इसे –