我正在开发一个iPhone应用程序,并且在控制器中获取(null)对IBOutlet字段的引用.我有一个UIViewController子类,在我的XIB中设置为File的所有者.我有一组连接到控制器的UI元素.从NIB加载并尝试在这些UI元素上设置属性后,我发现它们是(null).澄清一些代码:
ExpandSearchPageController.h:
@interface ExpandSearchPageController : UIViewController
{
  IBOutlet UITextView * completeMessageView;
}
-(void)checkTextField;
@property (nonatomic, retain) IBOutlet UITextView * completeMessageView;
Run Code Online (Sandbox Code Playgroud)
ExpandSearchPageController.m:
@implementation ExpandSearchPageController
@synthesize completeMessageView;
-(void)checkTextField
{
  NSLog(@"text field: %@",completeMessageView);
}
Run Code Online (Sandbox Code Playgroud)
ExpandSearchPageController被设置为ExpandSearchPage.xib的文件所有者.ExpandSearchPage.xib的UITextView连接到completeMessageView.
我打电话的时候
ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]];
[searchExpanderPage checkTextField];
Run Code Online (Sandbox Code Playgroud)
结果是
"text field: (null)"
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用积木和Grand Central Dispatch.我被告知(并在Apple文档中阅读)任何块中引用的对象都会被保留.
例如:
^{  
    self.layer.transform = CATransform3DScale(CATransform3DMakeTranslation(0, 0, 0), 1, 1, 1);
    self.layer.opacity = 1;
}
Run Code Online (Sandbox Code Playgroud)
"自我"得到保留,因此泄漏.为了避免这种情况,我需要将self分配给:
__block Object *blockSelf = self;
Run Code Online (Sandbox Code Playgroud)
然后使用blockSelf而不是self在我的块中.
我的问题是:当你的块有更多的代码并引用几个对象时会发生什么?我需要将它们全部分配给__block对象吗?例如:
^{  
    [self doSomething];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"prevName == %@", artistName];
    [request setEntity:entity];
    [request setPredicate:predicate];
    Object *newObject = [[Object alloc] init];
    [someArray addObject];
    [newObject release];
}
Run Code Online (Sandbox Code Playgroud) 每当我将视图控制器推到我的堆栈上,然后将其弹出,我收到此错误:
*** -[CALayer retainCount]: message sent to deallocated instance <memory address>
Run Code Online (Sandbox Code Playgroud)
它似乎发生在dealloc正在弹出的视图控制器上调用之后,并且仅对此视图控制器是独占的.我确定CALayer与视图本身有关,因为我不使用它们.
有任何想法吗?
编辑:这是回溯
(gdb) bt
#0  0x01fcd3a7 in ___forwarding___ ()
#1  0x01fa96c2 in __forwarding_prep_0___ ()
#2  0x01fc10e8 in CFGetRetainCount ()
#3  0x01cbc770 in CA::release_root_if_unused ()
#4  0x01cbc707 in x_hash_table_remove_if ()
#5  0x01cbc4ec in CA::Transaction::commit ()
#6  0x01cc4838 in CA::Transaction::observer_callback ()
#7  0x01fa5252 in __CFRunLoopDoObservers ()
#8  0x01fa465f in CFRunLoopRunSpecific ()
#9  0x01fa3c48 in CFRunLoopRunInMode ()
#10 0x027dd615 in GSEventRunModal ()
#11 0x027dd6da in GSEventRun ()
#12 0x0057cfaf …Run Code Online (Sandbox Code Playgroud) 是不是不必保留静态变量,因为它在程序的持续时间内保持不变,无论你是否释放它?
请参阅此代码:https: //github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29
我已经看到了以下代码片段:
在标题中:
SomeClass *bla;
@property(nonatomic,retain) SomeClass *bla;
Run Code Online (Sandbox Code Playgroud)
在实现文件中:
@synthesize bla;
Run Code Online (Sandbox Code Playgroud)
然后
self.bla = [[SomeClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
我认为这项任务将'bla'的保留计数提高了两倍; 一旦通过alloc/init调用,然后通过我们要求通过合成属性设置器发生的保留.
因此,我通常会声明我的属性如下:
在标题中:
SomeClass *_bla; // note the underscore
@property(nonatomic,retain) SomeClass *bla;
Run Code Online (Sandbox Code Playgroud)
在实现文件中:
@synthesize bla = _bla;
Run Code Online (Sandbox Code Playgroud)
然后
_bla = [[SomeClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
如果我最初的假设是正确的 - 我有兴趣听听是否有'正确'的方法来做到这一点,即属性的声明,初始化和内存管理?
对于iOS开发人员,代理几乎无处不在.
似乎我们需要使用"assign"而不是像这样保留一个委托
@property(assign) id delegate;
Run Code Online (Sandbox Code Playgroud)
原因是避免循环循环问题为什么Objective-C委托通常给予属性赋值而不是保留?
我看到很多代码,他们仍然使用"保留".所以这里的问题是,如果我们使用retain作为委托,我们仍会得到循环循环问题吗?
谢谢
有没有办法快速将对象的保留计数注销到Xcode的控制台?如果没有,那么下一个最佳选择是什么?
我有以下代码在我的Swift应用程序上分享Instagram上的图像:@IBAction func instagramShareButton(sender:AnyObject){
    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
    let path = documentsDirectory.stringByAppendingPathComponent("Share Icon.igo")
    let imageName: String = "Share Icon.png"
    let image = UIImage(named: imageName)
    let data = UIImagePNGRepresentation(image!)
    data!.writeToFile(path, atomically: true)
    let imagePath = documentsDirectory.stringByAppendingPathComponent("Share Icon.igo")
    let rect = CGRectMake(0, 0, 0, 0)
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0)
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    UIGraphicsEndImageContext()
    let fileURL = NSURL(fileURLWithPath: imagePath)
    print("fileURL = \(fileURL)")
    var interactionController = UIDocumentInteractionController(URL: fileURL)
    interactionController.delegate = self
    interactionController.UTI = "com.instagram.exclusivegram"
    let msgBody = "My message"
    interactionController.annotation = NSDictionary(object: msgBody, forKey: …Run Code Online (Sandbox Code Playgroud) 考虑到这种情况:如果我创建了一个活动并且它移动到后台并且此活动包含Fragment设置为,setRetainInstance(true)则Android操作系统可能在某些时候仍然决定关闭活动的托管过程以释放内存.
然后,Activity状态被保存onSaveInstanceState(Bundle)在哪里 - 据我所知 - 将相关Bundle内容写入文件系统,以便在关闭过程中继续存在.(因此束中对象的要求是Serializable).稍后,可以通过新进程检索应用程序状态onRestoreInstanceState(Bundle).
相反,我Fragment被允许包含不一定的变量Serializable.因此,我想,Fragment不能像磁盘一样存储在磁盘Bundle上.那么当进程被杀死时,我的片段会发生什么?
我想知道这个阅读开发人员的指南(http://developer.android.com/guide/components/processes-and-threads.html):
保存当前对用户不可见的活动的进程(已调用活动的onStop()方法).这些过程对用户体验没有直接影响,系统可以随时终止它们以回收前台,可见或服务进程的内存.通常有许多后台进程在运行,因此它们保存在LRU(最近最少使用的)列表中,以确保具有用户最近看到的活动的进程是最后被杀死的进程.如果活动正确实现其生命周期方法并保存其当前状态,则终止其进程将不会对用户体验产生明显影响,因为当用户导航回活动时,活动将恢复其所有可见状态.
我理解上面的杀戮,以便关闭VM实例并将进程的状态写入文件系统(这里是进行Bundle中).稍后读取包以恢复该过程.由于片段的保留不涉及生命周期方法,因为我不知道如何保留例如指向网络连接的指针(你当然不应该在片段中有这样的指针),我想知道片段是否存在如果在此期间关闭该过程,仍然会恢复.我得出结论,他们肯定需要重新创建,因此生命周期方法应尽可能优先setRetainInstance(true)考虑.
这个假设是否有意义?